package com.xiangxiao.rpan.utils.file;

import com.xiangxiao.rpan.utils.file.type.FileTypeDefiner;
import com.xiangxiao.rpan.utils.ReflectUtil;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @auther xiangxiao
 * @email 573768011@qq.com
 * @data 2022/12/30 16:29
 */
public class FileTypeContext {
  private static List<FileTypeDefiner> fileTypeDefinerList = new ArrayList<>();

  static {
    Set<Class> allSubTypeOfFileTypeDefiner = ReflectUtil.getAllSubTypeOf(FileTypeDefiner.class, "com.rubin.rpan.util.file.type");
    if (allSubTypeOfFileTypeDefiner != null && !allSubTypeOfFileTypeDefiner.isEmpty()) {
      allSubTypeOfFileTypeDefiner.stream().forEach(subTypeOfFileTypeDefinerClass -> {
        FileTypeDefiner fileTypeDefiner = (FileTypeDefiner) ReflectUtil.createInstance(subTypeOfFileTypeDefinerClass);
        fileTypeDefinerList.add(fileTypeDefiner);
      });
    }
  }

  /**
   * 通过文件名称获取文件类型标识
   *
   * @param filename
   * @return
   */
  public static Integer getFileTypeCode(String filename) {
    if (fileTypeDefinerList.isEmpty()) {
      throw new RuntimeException("获取文件类型失败");
    }
    fileTypeDefinerList = fileTypeDefinerList.stream()
        .sorted(Comparator.comparingInt(FileTypeDefiner::getOrder).reversed())
        .collect(Collectors.toList());
    for (FileTypeDefiner fileTypeDefiner : fileTypeDefinerList) {
      if (fileTypeDefiner.isMatched(filename)) {
        return fileTypeDefiner.getFileTypeCode();
      }
    }
    throw new RuntimeException("获取文件类型失败");
  }
}
